[IA64] ptc.g virtualization fix
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Mon, 26 Jun 2006 20:33:01 +0000 (14:33 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Mon, 26 Jun 2006 20:33:01 +0000 (14:33 -0600)
VMM only needs to switch rr0 and pta when emulating ptc.g.
Because VMM only use rr0 and pta to do global purge on other LPs.
VMM doesn't need to switch rr7, it is time consuming operation.

Signed-off-by: Anthony Xu <anthony.xu@intel.com>
xen/arch/ia64/vmx/vmmu.c
xen/arch/ia64/vmx/vtlb.c

index df55aea9ef5de527f368a004b902ef832333865b..add9e5d6be3924d3ccd21483b2389a59f20356e3 100644 (file)
@@ -517,7 +517,7 @@ struct ptc_ga_args {
 
 static void ptc_ga_remote_func (void *varg)
 {
-    u64 oldrid, moldrid;
+    u64 oldrid, moldrid, mpta;
     struct ptc_ga_args *args = (struct ptc_ga_args *)varg;
     VCPU *v = args->vcpu;
 
@@ -525,10 +525,13 @@ static void ptc_ga_remote_func (void *varg)
     VMX(v, vrr[0]) = args->rid;
     moldrid = ia64_get_rr(0x0);
     ia64_set_rr(0x0,vrrtomrr(v,args->rid));
+    mpta = ia64_get_pta();
+    ia64_set_pta(v->arch.arch_vmx.mpta);
     ia64_srlz_d();
     vmx_vcpu_ptc_l(v, args->vadr, args->ps);
     VMX(v, vrr[0]) = oldrid; 
     ia64_set_rr(0x0,moldrid);
+    ia64_set_pta(mpta);
     ia64_dv_serialize_data();
 }
 
index ba6bce42cac997ce0783b4b701146df694c9d07c..f0020b48ce87f4d69c6a6b103cfbd31710ea48e4 100644 (file)
@@ -267,14 +267,6 @@ static void vtlb_purge(VCPU *v, u64 va, u64 ps)
 //    machine_tlb_purge(va, ps);
 }
 
-static void
-switch_rr7_and_pta(VCPU* v)
-{
-    if (VMX_DOMAIN(v))
-        vmx_load_rr7_and_pta(v);
-    else
-        load_region_reg7_and_pta(v);
-}
 
 /*
  *  purge VHPT and machine TLB
@@ -287,8 +279,6 @@ static void vhpt_purge(VCPU *v, u64 va, u64 ps)
     size = PSIZE(ps);
     start = va & (-size);
     end = start + size;
-    if (current != v)
-        switch_rr7_and_pta(v);
     while(start < end){
         hash_table = (thash_data_t *)ia64_thash(start);
         tag = ia64_ttag(start);
@@ -310,8 +300,6 @@ static void vhpt_purge(VCPU *v, u64 va, u64 ps)
         start += PAGE_SIZE;
     }
     machine_tlb_purge(va, ps);
-    if (current != v)
-        switch_rr7_and_pta(current);
 }
 
 /*